/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import dao.ProjetoDAO;
import enumeracao.StatusProjeto;

import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;


import modelo.Categoria;
import modelo.DonoProjeto;
import modelo.Freelancer;
import modelo.Habilidade;
import modelo.Projeto;
import modelo.Usuario;
import util.ControlaConexao;
import util.JSFUtil;
import util.Util;

@ManagedBean
@RequestScoped
public class ProjetoBean implements Serializable{
    
     
    @ManagedProperty(value="#{requestScope.entityManager}")
    private EntityManager entityManager;
    @ManagedProperty(value="#{sessionScope.usuarioSessaoBean.usuario}")
    private Usuario usuario;
    @ManagedProperty(value="#{viewScope.habilidadeBean}")
    private HabilidadeBean habilidadeBean;
    private List<Projeto> projetos = new ArrayList<Projeto>();
    private Projeto projeto = new Projeto();
    private Projeto projConsultado = new Projeto();
    
    /* Campos de Pesquisa 
     *  N�o foi utilizado o do modelo, pois o ocorria a valida��o dos campos pelo
     *  Bean Validator
     * */
    private String nome;
    private boolean emAberto=false;
    private Categoria categoria;
    private Integer ano;
    private ProjetoDAO projetoDAO;
   //**Campos

    public EntityManager getEntityManager() {
        return entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public List<Projeto> getProjetos() {
        return projetos;
    }

    public void setProjetos(List<Projeto> projetos) {
        this.projetos = projetos;
    }

    public Projeto getProjeto() {
        return projeto;
    }

    public void setProjeto(Projeto projeto) {
        this.projeto = projeto;
    }  
    
    
    public Integer getAno() {
		return ano;
	}

	public void setAno(Integer ano) {
		this.ano = ano;
	}
	
	

	@PostConstruct
    public void iniciar() {
            
        projetoDAO = new ProjetoDAO(entityManager);
        
        if (usuario instanceof DonoProjeto) {
        	
        	this.projeto.setDonoProjeto((DonoProjeto)usuario);
        }else{
            this.projeto.setStatus(StatusProjeto.ABERTO);
        }
        
        this.projetos = projetoDAO.pesquisar(projeto);
    }
    
    public void pesquisar() {
    	
    	this.projeto.setCategoria(categoria);
    	this.projeto.setNome(nome);
    			
    	
    	if (!Util.isNull(ano)){
    		Calendar dataCriacao = Calendar.getInstance();
    		dataCriacao.set(Calendar.YEAR, ano);
    		this.projeto.setDataCriacao(dataCriacao);   		
    	}
        
        if(emAberto || usuario instanceof Freelancer) {
            this.projeto.setStatus(StatusProjeto.ABERTO);
        }
        else {
            this.projeto.setStatus(null);
        }
       projetos = projetoDAO.pesquisar(this.projeto);
    }

    public Projeto getProjConsultado() {
        return projConsultado;
    }

    public void setProjConsultado(Projeto projConsultado) {
        this.projConsultado = projConsultado;
    }

    public ProjetoDAO getProjetoDAO() {
        return projetoDAO;
    }

    public void setProjetoDAO(ProjetoDAO projetoDAO) {
        this.projetoDAO = projetoDAO;
    }
    
    public void consultar(Long id) {
        this.projConsultado = projetoDAO.consulta(id);
    }
    
    
    public void salvar() {
        try {
           projeto.setDonoProjeto((DonoProjeto) usuario);
           projeto.setHabilidades(habilidadeBean.getHabilidades());
           projeto.setCategoria(habilidadeBean.getCategoria());
           projeto.setDataCriacao(Calendar.getInstance());
           projetoDAO.inserir(projeto);
          
           habilidadeBean.setHabilidades(new ArrayList<Habilidade>());
           habilidadeBean.setHabSelecionada(null);
           habilidadeBean.setCategoria(new Categoria());
           this.projeto = new Projeto();
            
           
           JSFUtil.addMessage("Registro salvo com sucesso");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

    public boolean isEmAberto() {
        return emAberto;
    }

    public void setEmAberto(boolean emAberto) {
        this.emAberto = emAberto;
    }

	public HabilidadeBean getHabilidadeBean() {
		return habilidadeBean;
	}

	public void setHabilidadeBean(HabilidadeBean habilidadeBean) {
		this.habilidadeBean = habilidadeBean;
	}
	
	
	public List<Integer>getAnos(){
		return Util.listYears();
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	

	
	 public void emitirRelatorio() throws Exception {
	        try {
	            
	            FacesContext fc = FacesContext.getCurrentInstance();
	            ExternalContext contexto = fc.getExternalContext();
	            HttpServletResponse response = (HttpServletResponse) contexto.getResponse();
	            
	            String caminho = contexto.getRealPath("/WEB-INF/report/report2.jasper");

	            
	           

	            JasperReport relatorio = (JasperReport) JRLoader
	                    .loadObjectFromFile(caminho);
	            HashMap<String,Object> parametros = new HashMap<String,Object>();
	            
	            
	             parametros.put("donoid", usuario.getId());
	             parametros.put("projetoid", projConsultado.getId());
	             JasperPrint relatorioPronto =  JasperFillManager
	                    .fillReport(caminho, parametros, ControlaConexao
	                     .getInstance().getConexao());
	             
	             contexto.responseReset();
	             contexto.setResponseContentType("application/pdf");
	             
	             OutputStream saida = response.getOutputStream();

	            
	           JasperExportManager.exportReportToPdfStream(relatorioPronto, saida);
	           
	           saida.close();
	           
	           fc.responseComplete();
	           

	        } catch (Exception e) {
	            e.printStackTrace();
	        }

	    }
    
    
}
